package com.lanyun.controller;

import com.lanyun.pojo.*;
import com.lanyun.service.Procurement_etailsService;
import com.lanyun.service.StockInfoService;
import com.lanyun.serviceimpl.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping(value = "/etails")
public class Procurement_etailsController {

    // 用于接收采购详情单的数据 进行判断 以及一系列功能

    @Autowired
    private ProcurementServiceImpl proimpl;

    @Autowired
    private Procurement_etailsServiceImpl pes;

    @Autowired
    private WarehouseServiceImpl warehouseService;

    @Autowired
    private StockServiceImpl stockServiceImpl;

    @Autowired
    private StockInfoServiceImpl sImpl;

    @Autowired
    private ProductServiceImpl ps;

    @RequestMapping(value = "/getdata")
    @ResponseBody
    public Object GetData(@RequestParam("id") String id, HttpSession session) {
        // 通过ID 查询出关联的相关数据
        Procurement procurement = proimpl.Getdata(id);
        System.out.println(procurement);
        // 存入到session
        session.setAttribute("procurments", procurement);
        if (procurement != null) {
                return 1;
            } else {
                return 2;
        }
    }


    @RequestMapping(value = "/show")
    public String Show(Model model,HttpSession session) {
        // 取出对象
        Admin admin = (Admin) session.getAttribute("admin");
        // 取出 采购订单表 session的值
        Procurement procurement = (Procurement) session.getAttribute("procurments");
        // 根据具体的采购订单表 查询对应的采购详情表
        List<Procurement_etails> pelist = pes.GetProcurementsByID(procurement.getPcm_ids());
        // 根据采购订单的供应商ID 和 采购订单详情表的商品ID 获取到对应的价格 循环采购详情订单表
        for (int i = 0 ; i < pelist.size() ; i ++){
            // 查询价格 获取到该中间对象
            Product_supplier pe = pes.GetPrices(String.valueOf(pelist.get(i).getProduct_id()),String.valueOf(procurement.getSupplier().getSupplier_id()));
            System.out.println(pe.getProduct_id());
            // 根据中间对象查询到商品的名称
            Product product = pes.GetProductByID(pe.getProduct_id());
            // 获取单个采购总价
            Double dou = pe.getPurchasingprice() * pelist.get(i).getAmount();
            BigDecimal b = new BigDecimal(dou);
            Double le = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
            // 将商品进价 商品数量 总价对应存储
            pelist.get(i).setPrices(pe.getPurchasingprice());
            pelist.get(i).setPrice(le);
            pelist.get(i).setProduct(product.getProduct_name());
        }
        // 存入到 model中
        model.addAttribute("pro",procurement);
        model.addAttribute("pe",pelist);
        model.addAttribute("admin",admin);
        return "procurement_etails";
    }

    // 接收审核
    @RequestMapping(value = "/audit")
    @ResponseBody
    public Object Audit(@RequestParam("p[]") String[] pid,@RequestParam("amounts[]") String[] amounts,@RequestParam("price[]") String[] price,HttpSession session){
        // 获取到审核的商品ID , 总量 , 以及单个总价
        // 进行一次判断 如果总量没有改变 将订单状态改成已审核
        // 如果总量改变了 则要更改总价 以及订单状态改成以审核
        // 取出登录角色
        Admin admin = (Admin) session.getAttribute("admin");
        Date date = new Date();
        // 设置日期格式
        String date1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        // 调取详情表对象 循环
        // 设置一个计算总价变量
        // 创建集合
        List<Object> data = new ArrayList<>();
        for(int i = 0 ; i < pid.length ; i++){
            // 获得该对象 进行数量判断
            Procurement_etails pe = pes.GetProcurement_etails(pid[i]);
            // 如果数量相同 只需要改变采购订单的状态
            if (pe.getAmount() == Integer.valueOf(amounts[i])){
                // 获取该关联采购表的主键
                int p = pe.getProcurement_id();
                // 修改采购订单表
                int j = proimpl.updataProcurement(String.valueOf(admin.getId()),date,"已审核",String.valueOf(p));
                // 判断如果成功 将数据存入集合 用于前端取值
                if (j == 1){
                   // 存入状态 审核人 审核日期
                    data.add(admin.getName());
                    data.add(date1);
                    data.add("已审核");
                    return data;
                }
            }else {
                // 获取该关联采购表的主键
                int p = pe.getProcurement_id();
                // 表示数量发生了变动 要改变 采购订单详情表的数据 以及 采购订单表
                int j = proimpl.updataProcurement(String.valueOf(admin.getId()),date,"已审核",String.valueOf(p));
                // 修改详情表的数量
                int k = pes.updataProcurement_etails(pe.getPurchase_id(),amounts[i]);
                // 如果 j+k == 2 表示成功
                if(j+k == 2){
                    // 一样存入
                    data.add(admin.getName());
                    data.add(date1);
                    data.add("已审核");
                    return data;
                }
            }
        }
        return 0;
    }

    @RequestMapping(value = "updataStatus")
    @ResponseBody
    public Object UpdataStatus(@RequestParam("id") String id,HttpSession session){
        // 修改采购订单表
        // 并且生成一个随机数的订单号
        int i =(int)(Math.random()*(10000)+90000);
        String waybill = "AJ"+ i;
        // 取出操作员
        Admin admin = (Admin) session.getAttribute("admin");
        // 日期
        Date date = new Date();
        // 设置日期格式
        String date1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        // 调取修改采购订单方法
        int j = proimpl.UpdataStatus(String.valueOf(admin.getId()),date,"已确认",waybill,id);
        if (j==1){
            // 表示修改成功 创建一个集合
            List<Object> data = new ArrayList<>();
            // 存入 操作者的名字 日期  状态 运单号
            data.add(admin.getName());
            data.add(date1);
            data.add("已确认");
            data.add(waybill);
            return data;
        }else {
            return null;
        }
    }

    // 商品详情单 删除 如果传回来的值 length为 0 则删除详细后 也要把主单给删除
    @RequestMapping(value = "removedata")
    @ResponseBody
    public Object Removedata(@RequestParam("id") String id , @RequestParam("pid") String pid , @RequestParam("lengths") String length){
        // 进行判断 是否是最后一条数据
        if ("1".equals(length)){
           // 是的话 要删除关联的主表
           // 调取要删除的方法 先删除详情表 在删除关联父表
           int i =  pes.RemoveProcurement_etailsByID(id);
           int j =  proimpl.RemoveProcurementByID(pid);
           if(i==j && i==1){
               // 表示成功
               return 1;
           }
        }else {
            // 如果不等于 1 表示还有数据 直接删除详情表
            int i = pes.RemoveProcurement_etailsByID(id);
            return i;
        }
            return null;
        }

     // 查询商品的仓库名字
    @RequestMapping("/warehousename")
    @ResponseBody
    public Object warehousename(@RequestParam("l1") String l1){
        // 调取方法获取到改商品的仓库类型
        Warehouse warehouse = warehouseService.selectWarehouse(l1);
        // 将名称进行返回
        return warehouse.getWarehouse_name();
    }

        // 产品入库
     @RequestMapping("/warehouse")
     @ResponseBody
    public Object Warehouse(@RequestParam("l1") String l1,@RequestParam("l2") String l2,@RequestParam("l3") String l3,@RequestParam("l4") String l4,HttpSession session){
        // 查询出产品的类型 和仓库
        // 将数据存入到表中
        // 修改订单状态
         // 取出操作员
         Admin admin = (Admin) session.getAttribute("admin");
         // 日期
         Date date = new Date();
         // 设置日期格式
         String date1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
         // 创建集合
        List<Object> list = new ArrayList<Object>();
        // 查出商品属于的仓库
        Warehouse warehouse = warehouseService.selectWarehouse(l1);
        // 查出商品的类型
        Product product = ps.GetProductByone(l1);
        // 通过主键获取到关联的详情表中未入库的订单总数 如果不是关联详情单中的最后一个 则该订单任然是未入库状态
         int count = pes.Count(l4);
         // 如果==1 则表示是最后一条未入库的详情表 可以修改入库状态
        if(warehouse != null && count == 1){
            // 修改表的状态
            int i = proimpl.UpdataEnd(String.valueOf(admin.getId()),date,"已入库",l4);
            list.add("已入库");
        }else {
            int i = proimpl.UpdataEnd(String.valueOf(admin.getId()),date,"未入库",l4);
        }
         // 修改详情表的状态
         int j = pes.updateEnd("已入库",l1);
         // 如果表的状态修改成功
             if (j==1){
             // 添加入库
             int s = stockServiceImpl.StockEnd(String.valueOf(warehouse.getWarehouse_id()),String.valueOf(product.getProduct_id()),l3);
             if (s==1){
                 int e = sImpl.infoEnd(String.valueOf(admin.getId()),date,String.valueOf(warehouse.getWarehouse_id()),l1,l3,String.valueOf(product.getProduct_typeid()));
                 if (e==1){
                     // 表示所有的数据修改 插入成功
                     list.add(admin.getName());
                     list.add(date1);
                     return list;
                 }
                 return null;
             }
             return null;
         }
         return null;
     }
}